www.gusucode.com > VC++ 以多种方式处理位图文件的例子源码程序 > VC++ 以多种方式处理位图文件的例子源码程序\code\View.cpp

    #include "stdafx.h"
#include "app.h"
#include "Doc.h"
#include "View.h"
#include "mainfrm.h"
//download by http://www.NewXing.com
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


IMPLEMENT_DYNCREATE(CDibtestView, CScrollView)

BEGIN_MESSAGE_MAP(CDibtestView, CScrollView)
	//{{AFX_MSG_MAP(CDibtestView)
	ON_COMMAND(ID_VIEW_NORMAL, OnViewNormal)
	ON_UPDATE_COMMAND_UI(ID_VIEW_NORMAL, OnUpdateViewNormal)
	ON_MESSAGE(WM_DOREALIZE, OnDoRealize)
	ON_WM_CHAR()
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_SETCURSOR()
	ON_COMMAND(ID_SELECT_ALL, OnSelectAll)
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  ON_COMMAND_RANGE(ID_ZOOMIN2, ID_ZOOMIN16, OnZoomin)
  ON_UPDATE_COMMAND_UI_RANGE(ID_ZOOMIN2, ID_ZOOMIN16, OnUpdateZoomin)
  ON_COMMAND_RANGE(ID_ZOOMOUT2, ID_ZOOMOUT16, OnZoomout)
  ON_UPDATE_COMMAND_UI_RANGE(ID_ZOOMOUT2, ID_ZOOMOUT16, OnUpdateZoomout)
END_MESSAGE_MAP()

CDibtestView::CDibtestView()
{
  m_bZoomIn = TRUE;
  m_nZoomIn = 1;
  m_nZoomOut = 1;

  m_hMagnify = AfxGetApp()->LoadCursor(IDC_MAGNIFY);
  m_hDropper = AfxGetApp()->LoadCursor(IDC_DROPPER);
  m_hRectangleSelection = AfxGetApp()->LoadCursor(IDC_RECTANGLE_SELECTION);
}

CDibtestView::~CDibtestView()
{
}

BOOL CDibtestView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CScrollView::PreCreateWindow(cs);
}

void CDibtestView::OnDraw(CDC* pDC)
{
	CDibtestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

  CSize size = GetTotalSize();
  CRect rect(0, 0, size.cx, size.cy);
  GetDocument()->m_Dib.Draw(*pDC, &rect);

  DrawSelectionRect(pDC);
}


void CDibtestView::DrawSelectionRect(CDC* pDC)
{
  CRectTracker RectTracker;
  RectTracker.m_nStyle = CRectTracker::dottedLine;
  RectTracker.m_rect = GetDocument()->m_Dib.GetWorkingArea()->BoundingRectangle();
  if (m_bZoomIn)
  {
    RectTracker.m_rect.top *= m_nZoomIn;
    RectTracker.m_rect.bottom *= m_nZoomIn;
    RectTracker.m_rect.left *= m_nZoomIn;
    RectTracker.m_rect.right *= m_nZoomIn;
  }
  else
  {
    RectTracker.m_rect.top /= m_nZoomOut;
    RectTracker.m_rect.bottom /= m_nZoomOut;
    RectTracker.m_rect.left /= m_nZoomOut;
    RectTracker.m_rect.right /= m_nZoomOut;
  }

  RectTracker.Draw(pDC);
}


BOOL CDibtestView::OnPreparePrinting(CPrintInfo* pInfo)
{
  pInfo->SetMaxPage(1);
	return DoPreparePrinting(pInfo);
}

void CDibtestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

void CDibtestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

#ifdef _DEBUG
void CDibtestView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CDibtestView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CDibtestDoc* CDibtestView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDibtestDoc)));
	return (CDibtestDoc*)m_pDocument;
}
#endif //_DEBUG

LRESULT CDibtestView::OnDoRealize(WPARAM wParam, LPARAM)
{
	ASSERT(wParam != NULL);
	CDibtestDoc* pDoc = GetDocument();
	if (pDoc->m_Dib.GetHDIB() == NULL)
		return 0L;  // must be a new document

  CPalette pal;
  pal.Attach(pDoc->m_Dib.GetHPALLETTE());
	CPalette* pPal = &pal;
	if (pPal != NULL)
	{
		CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
		ASSERT_KINDOF(CMainFrame, pAppFrame);

		CClientDC appDC(pAppFrame);
		// All views but one should be a background palette.
		// wParam contains a handle to the active view, so the SelectPalette
		// bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
		CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);

		if (oldPalette != NULL)
		{
			UINT nColorsChanged = appDC.RealizePalette();
			if (nColorsChanged > 0)
				pDoc->UpdateAllViews(NULL);
			appDC.SelectPalette(oldPalette, TRUE);
		}
		else
		{
			TRACE0("\tSelectPalette failed in CDibView::OnPaletteChanged\n");
		}
	}
  pal.Detach();

	return 0L;
}


void CDibtestView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
  GetDocument()->m_Dib.Draw(*pDC, &pInfo->m_rectDraw);
}

void CDibtestView::OnZoomin(UINT nID) 
{
  m_bZoomIn = TRUE;
  m_nZoomIn = (nID - ID_ZOOMIN2) + 2;
  CSize size(GetDocument()->m_Dib.Size());
  size.cx *= m_nZoomIn;
  size.cy *= m_nZoomIn;
  SetScrollSizes(MM_TEXT, size);
  Invalidate();
}

void CDibtestView::OnUpdateZoomin(CCmdUI* pCmdUI) 
{
  if (m_bZoomIn)
	  pCmdUI->SetCheck((pCmdUI->m_nID - ID_ZOOMIN2+2) == (UINT) m_nZoomIn);
  else
	  pCmdUI->SetCheck(FALSE);
}

void CDibtestView::OnZoomout(UINT nID) 
{
  m_bZoomIn = FALSE;
  m_nZoomOut = (nID - ID_ZOOMOUT2) + 2;
  CSize size(GetDocument()->m_Dib.Size());
  size.cx /= m_nZoomOut;
  size.cy /= m_nZoomOut;
  SetScrollSizes(MM_TEXT, size);
  Invalidate();
}

void CDibtestView::OnUpdateZoomout(CCmdUI* pCmdUI) 
{
  if (!m_bZoomIn)
	  pCmdUI->SetCheck((pCmdUI->m_nID - ID_ZOOMOUT2+2) == (UINT) m_nZoomOut);
  else
	  pCmdUI->SetCheck(FALSE);
}

void CDibtestView::OnViewNormal() 
{
  m_bZoomIn = FALSE;
  m_nZoomOut = 1;
  m_nZoomIn = 1;
  SetScrollSizes(MM_TEXT, GetDocument()->m_Dib.Size());
  Invalidate();
}

void CDibtestView::OnUpdateViewNormal(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck((m_nZoomIn == 1) && (m_nZoomOut == 1));
}

void CDibtestView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);

	if (bActivate)
	{
    GetMainFrame()->m_HistogramBar.Invalidate();
		ASSERT(pActivateView == this);
		OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE);
	}
}

void CDibtestView::OnInitialUpdate() 
{
	CScrollView::OnInitialUpdate();
	SetScrollSizes(MM_TEXT, GetDocument()->m_Dib.Size());
}

void CDibtestView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/) 
{
  CSize size(GetDocument()->m_Dib.Size());
  if (m_bZoomIn)
  {
    size.cx *= m_nZoomIn;
    size.cy *= m_nZoomIn;
  }
  else
  {
    size.cx /= m_nZoomOut;
    size.cy /= m_nZoomOut;
  }
  SetScrollSizes(MM_TEXT, size);
  Invalidate();
}

BOOL CDibtestView::OnEraseBkgnd(CDC* pDC) 
{
  //return CScrollView::OnEraseBkgnd(pDC);
  CBrush br;
  br.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 0, 0));
  FillOutsideRect(pDC, &br);
  return TRUE;
}

void CDibtestView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if (nChar == VK_ESCAPE)
	{
		CFrameWnd* pFrame = (CFrameWnd*) AfxGetMainWnd();
	  pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN);
	}
  CView::OnChar(nChar, nRepCnt, nFlags);
}


BOOL CDibtestView::GetColorAndPositionAtCursor(COLORREF& color, int& x, int& y) 
{
  POINT point;
  if (!GetCursorPos(&point))
    return FALSE;
  ScreenToClient(&point);

  CSize size = GetTotalSize();
  CRect rect(0, 0, size.cx, size.cy);
  if (!rect.PtInRect(point))
    return FALSE;

  CClientDC dc(this);
  color = dc.GetPixel(point.x, point.y);

  x = point.x;
  y = point.y;

  if (m_bZoomIn)
  {
    x /= m_nZoomIn;
    y /= m_nZoomIn;
  }
  else
  {
    x *= m_nZoomOut;
    y *= m_nZoomOut;
  }

  return TRUE;
}


void CDibtestView::OnLButtonDown(UINT /*nFlags*/, CPoint point) 
{
  if (GetMainFrame()->m_ToolOption == Magnify)
  {
    if (m_nZoomOut > 2 && m_nZoomOut <= 16)
      OnZoomout(ID_ZOOMOUT2+m_nZoomOut-3);
    else if (m_nZoomOut == 2)
      OnViewNormal();
    else if (m_nZoomOut == 1 && m_nZoomIn == 1)
      OnZoomin(ID_ZOOMIN2);
    else if (m_nZoomIn < 16)
      OnZoomin(ID_ZOOMIN2+m_nZoomIn-1);
  }
  else if (GetMainFrame()->m_ToolOption == ColorDropper)
  {
    int x;
    int y;
    COLORREF color;
    if (GetColorAndPositionAtCursor(color, x, y)) 
    {
      GetMainFrame()->m_PaletteBar.m_ForeColor = color;
      GetMainFrame()->m_PaletteBar.Invalidate();
    }
  }
  else if (GetMainFrame()->m_ToolOption == RectangleSelection)
  {
    Invalidate();
    CRectTracker RectTracker;
    if (RectTracker.TrackRubberBand(this, point))
    {
      CWaitCursor wait;
      //m_bHaveSelectionRect = TRUE;
      CDibtestDoc* pDoc = GetDocument();

      //ensure the rectangle is the right way up
      if (RectTracker.m_rect.left > RectTracker.m_rect.right)
      {
        int t = RectTracker.m_rect.left;
        RectTracker.m_rect.left = RectTracker.m_rect.right;
        RectTracker.m_rect.right = t;
      }

      //ensure the rectangle is the right way up
      if (RectTracker.m_rect.top > RectTracker.m_rect.bottom)
      {
        int t = RectTracker.m_rect.top;
        RectTracker.m_rect.top = RectTracker.m_rect.bottom;
        RectTracker.m_rect.bottom = t;
      }

      //clip the selection to the maximum size of the window
      CSize size(GetTotalSize());
      if (RectTracker.m_rect.left < 0)
        RectTracker.m_rect.left = 0;
      if (RectTracker.m_rect.top < 0)
        RectTracker.m_rect.top = 0;
      if (RectTracker.m_rect.right > size.cx)
        RectTracker.m_rect.right = size.cx;
      if (RectTracker.m_rect.bottom > size.cy)
        RectTracker.m_rect.bottom = size.cy;

      if (m_bZoomIn)
      {
        RectTracker.m_rect.top /= m_nZoomIn;
        RectTracker.m_rect.bottom /= m_nZoomIn;
        RectTracker.m_rect.left /= m_nZoomIn;
        RectTracker.m_rect.right /= m_nZoomIn;
      }
      else
      {
        RectTracker.m_rect.top *= m_nZoomOut;
        RectTracker.m_rect.bottom *= m_nZoomOut;
        RectTracker.m_rect.left *= m_nZoomOut;
        RectTracker.m_rect.right *= m_nZoomOut;
      }

      pDoc->m_Dib.SetWorkingArea(new CRectWorkingArea(RectTracker.m_rect));
      pDoc->UpdateHistogramData();
    }
    else
    {
      //m_bHaveSelectionRect = FALSE;
      MessageBeep(0);
    }
    Invalidate(FALSE);
  }
}


void CDibtestView::OnRButtonDown(UINT /*nFlags*/, CPoint /*point*/) 
{
  if (GetMainFrame()->m_ToolOption == Magnify)
  {
    if (m_nZoomIn > 2 && m_nZoomIn <= 16)
      OnZoomin(ID_ZOOMIN2+m_nZoomIn-3);
    else if (m_nZoomIn == 2)
      OnViewNormal();
    else if (m_nZoomOut == 1 && m_nZoomIn == 1)
      OnZoomout(ID_ZOOMOUT2);
    else if (m_nZoomOut < 16)
      OnZoomout(ID_ZOOMOUT2+m_nZoomOut-1);
  }
  else if (GetMainFrame()->m_ToolOption == ColorDropper)
  {
    int x;
    int y;
    COLORREF color;
    if (GetColorAndPositionAtCursor(color, x, y)) 
    {
      GetMainFrame()->m_PaletteBar.m_BackColor = color;
      GetMainFrame()->m_PaletteBar.Invalidate();
    }
  }
}


BOOL CDibtestView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
  m_hMagnify = AfxGetApp()->LoadCursor(IDC_MAGNIFY);
  m_hDropper = AfxGetApp()->LoadCursor(IDC_DROPPER);
  m_hRectangleSelection = AfxGetApp()->LoadCursor(IDC_RECTANGLE_SELECTION);

  BOOL bSuccess = TRUE;
  if (GetMainFrame()->m_ToolOption == Magnify)
    ::SetCursor(m_hMagnify);
  else if (GetMainFrame()->m_ToolOption == RectangleSelection)
    ::SetCursor(m_hRectangleSelection);
  else if (GetMainFrame()->m_ToolOption == ColorDropper)
    ::SetCursor(m_hDropper);
  else
    bSuccess = CScrollView::OnSetCursor(pWnd, nHitTest, message);

  return bSuccess;
}


void CDibtestView::OnSelectAll() 
{
  CWaitCursor wait;
  CDibtestDoc* pDoc = GetDocument();
  CSize size(pDoc->m_Dib.Size());
  pDoc->m_Dib.SetWorkingArea(new CRectWorkingArea(pDoc->m_Dib.Rect()));
  pDoc->UpdateHistogramData();
  Invalidate(FALSE);
}